<?php
/**
 * 用户登陆身份验证类 单列 
 */
namespace logic\user;
class Passport{
    
    private $roleList = array( 0=> 'system', 1=> 'root', 2=>'admin' , 3=> 'site' ,4 => 'member');
         // 平台代号=>角色 平台对应的角色 : system [系统 类似超级用户用户] root [后台管理员] admin [代理管理员] site [站点商户]  member [平台用户]
    
    private $plat;  //访问的平台应用 1 平台管理后台 2 代理商管理平台 3 站点平台 4前端用户展示平台
    private $channel;   //访问入口渠道类型 1 web 2 wap 3 微信小程序 
    private $passportObject;    // 登录对象
    private $caseKey;
    private $loginType; // 登录类型 account token
    private $loginInfo; // 各个平台各种方式登录之后返回的资料
    private function __construct($plat,$channel){
        if( !$plat )    logicE( '平台渠道不能为空' );
        $this->plat = $plat;
        $this->channel = $channel;
        $this->caseKey = 'logic_user_login_uid'.$plat;
        $this->loadPlatPassport();
    }

    /**
     * 获取登录信息
     */
    public function __get($name){
        return $this->$name;
    }

    /**
     * 获取用户对象
     */
    public static function getInstance($plat = '',$channel = ''){
        static $_instance	= '';
		if(! $_instance ){
            $_instance = new \logic\user\Passport($plat,$channel);
            bind('passport',$_instance);
		}
		return $_instance;
    }
    

    /**
     * 用户登录
     * @param $param => array(
     *    'logintype'   => 默认account ，accounttoken,其他的 token ，mobile
     *    其他登录信息
     * )
     */
    public function login($param){
        $loginInfo = $this->passportObject->login($param);
        if( is_array( $loginInfo )){
            $userId = $loginInfo['id'];   // 只需要ID 返回的ID 应该是对应平台的用户ID 如果用户ID不是id字段 需在这里做具体判断
        }else{
            $userId = $loginInfo;
        }
        if( $userId ){
            $info = session($this->caseKey,$userId);
        }
        $this->loginType = isset($param['logintype']) ?  $param['logintype'] : 'account';
        $this->loginInfo = $loginInfo;
        return $userId;
    }



    /**
     * 注销登录
     */
    public function unLogin(){
        session($this->caseKey,null);
    }

    /**
     * 检查是否已经登录 如果已经登录返回登录的用户对象
     * @return Object User | false
     */
    public function checkLogin(){
       // session($this->caseKey,1); // 记得删掉呀
        $userId = session($this->caseKey);
        $loginRole = $this->roleList[$this->plat];
        if( $userId ){
            session($this->caseKey,$userId);
            return \logic\user\User::getInstance($userId,$loginRole);
        }
        return false;
    }

    /**
     * 加载各个渠道的身份校验类
     */
    private function loadPlatPassport(){
        // 1 平台管理后台 2 代理商管理平台 3站点管理后台 4前端用户展示平台
        $classList = array(
            1 => '\logic\user\RootPassport',
            2 => '\logic\admin\Passport',
            3 => '\logic\site\Passport',
            4 => '\logic\member\Passport'
        );
        if(!$classList[$this->plat])return false;
        $this->passportObject = new $classList[$this->plat]();
    }
}